#include <iostream>
#include <cstdio>
#include <cstring>
#include <unistd.h>

using namespace std;

int main()
{
    fprintf(stdout, "hello fprintf\n");
    const char* str = "hello write\n";
    write(1, str, strlen(str));

    fork(); //创建子进程
    return 0;
}


// #include <iostream>
// #include <unistd.h>

// using namespace std;

// int main()
// {
//     while(true)
//     {
//         //能触发行缓冲的刷新策略
//         printf("%s\n", "hehehehe");
//         sleep(1);
//     }

//     return 0;
// }

// int main()
// {
//     int fd = open("file.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
//     assert(fd != -1);

//     char buffer[256] = { 0 };   //缓冲区
//     int n = read(0, buffer, sizeof(buffer));    //读取信息至缓冲区中
//     buffer[n] = '\0';

//     //写入成功后，在写入文件中
//     write(fd, buffer, strlen(buffer));

//     close(fd);
//     return 0;
// }

// #include <iostream>
// #include <unistd.h>
// #include <signal.h>

// using namespace std;

// int count = 0;

// void handler(int signo)
// {
//     cout << "count: " << count << endl;
//     exit(1);
// }

// int main()
// {
//     //定一个 1 秒的闹钟，查看算力
//     signal(14, handler);
//     alarm(1);   //一秒后闹钟响起
//     while(true) count++;

//     return 0;
// }

// #include <iostream>
// #include <cstdlib>
// #include <cerrno>
// #include <cassert>
// #include <cstring>
// #include <sys/types.h>
// #include <sys/stat.h>
// #include <fcntl.h>
// #include <unistd.h>

// using namespace std;

// int main()
// {
//     //打开两个目标文件
//     int fdNormal = open("log.normal", O_WRONLY | O_CREAT | O_TRUNC, 0666);
//     int fdError = open("log.error", O_WRONLY | O_CREAT | O_TRUNC, 0666);
//     assert(fdNormal != -1 && fdError != -1);

//     //进行重定向
//     int ret = dup2(fdNormal, 1);
//     assert(ret != -1);
//     ret = dup2(fdError, 2);
//     assert(ret != -1);

//     for(int i = 10; i >= 0; i--)
//         cout << i << " ";  //先打印部分信息
//     cout << endl;

//     int fd = open("cxk.txt", O_RDONLY); //打开不存在的文件
//     if(fd == -1)
//     {
//         //对于可能存在的错误信息，最好使用 perror / cerr 打印，方便进行重定向
//         cerr << "open fail! errno: " << errno << " | " << strerror(errno) << endl;
//         exit(-1);   //退出程序
//     }

//     close(fd);

//     return 0;
// }


// #include <iostream>

// using namespace std;

// int main()
// {
//     cout << "标准输出 stdout" << endl;
//     cerr << "标准错误 stderr" << endl;
//     return 0;
//}

// #include<iostream>
// #include <cstdio>
// #include <cassert>
// #include <sys/types.h>
// #include <sys/stat.h>
// #include <fcntl.h>
// #include <unistd.h>

// using namespace std;

// int main()
// {
//     //关闭 stdout 写入数据
//     close(1);

//     int fd = open("file.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
//     assert(fd != -1);   //存在打开失败的情况

//     cout << "单纯打开文件 fd: " << fd << endl;
//     cout << "you can see me! not on screen" << endl;

//     close(fd);  //记得关闭

//     return 0;
// }

// int main()
// {
//     //先打开文件 file.txt
//     int fd = open("file.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
//     assert(fd != -1);   //存在打开失败的情况

//     cout << "单纯打开文件 fd: " << fd << endl;

//     close(fd);  //记得关闭

//     //先关闭，再打开
//     close(0);   //关闭1号文件执行流
//     fd = open("file.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);

//     cout << "先关闭1号文件执行流，再打开文件 fd: " << fd << endl;

//     close(fd);

//     return 0;
// }

// int main()
// {
//     //分别打开三个 FILE 对象
//     FILE* fp1 = fopen("test1.txt", "w");
//     FILE* fp2 = fopen("test2.txt", "w");
//     FILE* fp3 = fopen("test3.txt", "w");

//     //对不同的 FILE* 进行操作
//     //……

//     //标准文件流
//     cout << "stdin->fd: " << stdin->_fileno << endl;
//     cout << "stout->fd: " << stdout->_fileno << endl;
//     cout << "stderr->fd: " << stderr->_fileno << endl;
//     cout << "===================================" << endl;
//     cout << "此时标准流的类型为：" << typeid(stdin).name() << endl;
//     cout << "此时文件流的类型为：" << typeid(fp1).name() << endl;
//     cout << "===================================" << endl;
//     //自己打开的文件流
//     cout << "fp1->fd: " << fp1->_fileno << endl;
//     cout << "fp2->fd: " << fp2->_fileno << endl;
//     cout << "fp3->fd: " << fp3->_fileno << endl;

//     //关闭
//     fclose(fp1);
//     fclose(fp2);
//     fclose(fp3);
//     fp1 = fp2 = fp3 = NULL;

//     return 0;
// }